import axios from 'axios'
// import { message } from 'antd';
import { Toast } from 'antd-mobile'
import { store } from '@/store/store'
import { logout } from '@/store/actions/login'
import { customHistory } from './history'
import { clearToken, setToken } from './token'
const http = axios.create({
  baseURL: 'http://toutiao.itheima.net/v1_0',
  // baseURL: 'http://geek.itheima.net/v1_0',
  timeout: 5000
})

// 将来可以继续进行 拦截器 的处理

// 请求拦截器
http.interceptors.request.use(config => {
  // 获取token
  const token = store.getState().login.token

  // 除了登录请求外，其他请求统一添加 token
  if (!config.url?.startsWith('/authorizations')) {
    config.headers!.Authorization = `Bearer ${token}`
  }

  return config
})

// 响应拦截器
http.interceptors.response.use(undefined, async error => {
  // 响应失败时，会执行此处的回调函数
  if (!error.response) {
    // 网路超时
    Toast.show('网络超时，请稍后再试')
    return Promise.reject(error)
  }

  if (error.response.status === 401) {
    // // token 过期，登录超时
    // Toast.show({
    //   content: '登录超时，请重新登录',
    //   duration: 1000,
    //   afterClose: () => {
    //     customHistory.push('/login', {
    //       from: customHistory.location.pathname
    //     })
    //     // 触发退出 action，将 token 等清除
    //     // store.dispatch(logout());
    //   }
    // })
    try {
      // 1 重新获取token
      // 判断 refresh_token是否存在
      const refresh_token = store.getState().login.refresh_token
      // 重新获取token失败
      if (!refresh_token) throw new Error('refresh_token 不存在')

      console.log('准备换取新的token')
      const res = await axios.put('http://toutiao.itheima.net/v1_0/authorizations', null, {
        headers: { Authorization: `Bearer ${refresh_token}` }
      })
      // message.error('登录超时，请重新登录', 1, () => {
      //   customHistory.push('/login', {
      //     from: customHistory.location.pathname
      //   })
      //   // 触发退出 action，将 token 等清除
      //   store.dispatch(logout())
      // })

      console.log('换取token res', res)
      // 更新本地token和redux中token
      const newToken = {
        token: res.data.data.token,
        refresh_token: refresh_token
      }
      console.log('newToken==>', newToken)
      // 3 将获取到的token保存到本地和redux中
      // 保存到本地
      setToken(newToken)
      // 保存到redux
      store.dispatch({
        type: 'login/token',
        payload: newToken
      })
      // 2 重新发送之前的请求
      console.dir(error)

      return http(error.config)
    } catch (error) {
      // 换取失败
      // 删除本地toekn
      clearToken()
      // 删除redux中的token
      store.dispatch({
        type: 'login/token', // 复用 login/token 目的都是给token赋值，只不过这里赋的是空值
        payload: { token: '', refresh_token: '' }
      })
      // 提示用户
      Toast.show({
        content: '登录超时，请重新登录!',
        duration: 1000,
        afterClose: () => {
          customHistory.push('/login', {
            from: customHistory.location.pathname
          })
          // 触发退出 action，将 token 等清除
          // store.dispatch(logout());
        }
      })
      return Promise.reject(error)
    }
  }
})

export { http }
